package com.spzx.product.helper;

import com.spzx.product.api.domain.vo.CategoryVo;
import org.springframework.util.CollectionUtils;

import java.util.ArrayList;
import java.util.List;

/**
 * 辅助工具类：
 */
    public class CategoryHelper {
        /**
         * 转换成树结构
         * @param allCategoryVolist 分类列表集合
         * @return 返回的是包含一级分类（及其子分类）的树结构集合。
         */
        public static List<CategoryVo> buildTree(List<CategoryVo> allCategoryVolist) {
            List<CategoryVo> categoryVoList = new ArrayList<>(); //创建返回pojo categoryVoList  返回的树结构分类集合
            if(!CollectionUtils.isEmpty(allCategoryVolist)){   //判断传入的总列表数据是否为空
                for (CategoryVo categoryVo : allCategoryVolist) {  //循环遍历总列表 数据  遍历分类列表
                    if(categoryVo.getParentId().intValue() == 0){ //查找所有一级分类   一级分类为true 进入  查找所有一级分类（父ID为0）
                        categoryVo = findChildren(categoryVo,allCategoryVolist); //找孩子，返回自己    传入遍历的单个数据 总数居   递归查找并添加子分类
                        categoryVoList.add(categoryVo);  //在返回pojo中 添加一级分类  一级分类包含了二级、三级  将构建好的一级分类（及其子分类）添加到返回集合中
                    }
                }
            }
            return categoryVoList;  // 返回树结构分类集合
        }
        /**
         * 利用递归算法：找孩子
         *      要求：
         *          1.级、同类问题可以使用递归。一级找二二级找三级  递归地查找当前节点的直接子节点
         *          2.递归出口。三级找四级，就会退出递归。因为我们分类数据只有三级。 当没有更多的子节点时，递归将自然结束，因为找不到符合条件的子节点
         * @param categoryVo 当前分类 （父节点）
         * @param allCategoryVolist 所有分类（含有当前分类的孩子数据）
         * @return 当前分类 （已填充子分类列表）
         */
        private static CategoryVo findChildren(CategoryVo categoryVo, List<CategoryVo> allCategoryVolist) {
            categoryVo.setChildren(new ArrayList<>()); //给children属性初始化。避免空指针。

            for (CategoryVo vo : allCategoryVolist) {  //遍历总列表数据  遍历所有分类
                // -128 ~ 127  常量池
                // 大于127比较是两个包装类型对象地址。注意！！！
                if(categoryVo.getId().intValue() == vo.getParentId().intValue()){ //当前分类的id正好是分类父id,那它就是当前分类的孩子  查找当前分类的直接子分类
                    vo = findChildren(vo,allCategoryVolist); //孩子再找孩子  递归查找子分类的子分类
                    categoryVo.getChildren().add(vo);  //获得 private List<Category> children; 添加元素vo  将找到的子分类添加到当前分类的子分类列表中
                }
            }
            return categoryVo;  // 返回已填充子分类列表的当前分类
        }
    }
